//
//  LabelScene.cpp
//  SimpleGame
//
//  Created by Scar1et on 2017/7/25.
//
//

// 头文件 -- 类库声明请放入头文件
#include "LabelScene.h"

// 层级：影响显示与事件响应
enum {
    // 背景
    levelBGSimple = 1,
    // 内容
    levelContentSimple = 101,
    // 对话框
    levelDialogSimple = 1001
};

// TAG：视图标记
enum {
    tagBack = 1
};

// 创建场景
Scene* LabelScene::createScene() {
    Scene* sLabel = Scene::create();
    sLabel->addChild(LabelScene::create());
    return sLabel;
}

// 初始化场景，自动调用
bool LabelScene::init() {
    // 先调用父类Init
    if (!Layer::init()) {
        return false;
    }
    
    // 手机按键监听器
    listenerKeyboard = EventListenerKeyboard::create();
    listenerKeyboard->onKeyReleased = CC_CALLBACK_2(LabelScene::onKeyReleased, this);
    // 添加到事件分发器中
    Director::getInstance()->getEventDispatcher()->addEventListenerWithSceneGraphPriority(listenerKeyboard, this);
    
    // 开始初始化
    // 成员变量初始化
    // 可视区域尺寸
    sizeVisible = Director::getInstance()->getVisibleSize();
    // 可视区域的出发点坐标
    positionOrigin = Director::getInstance()->getVisibleOrigin();
    // 屏幕尺寸
    sizeWin = Director::getInstance()->getWinSize();
    
    this->initContent();
    
    // 初始化成功
    return true;
}

// 内容初始化
void LabelScene::initContent() {
    // 返回按钮
    auto lBack = Label::createWithSystemFont("返回", "arial.ttf", 28);
    lBack->setTextColor(Color4B::WHITE);
    lBack->setHorizontalAlignment(TextHAlignment::LEFT);
    lBack->setVerticalAlignment(TextVAlignment::CENTER);
    lBack->setDimensions(120, 40);
    auto milBack = MenuItemLabel::create(lBack, CC_CALLBACK_1(LabelScene::onClicked, this));
    milBack->setTag(tagBack);
    milBack->setPosition(Vec2(positionOrigin.x + 80, positionOrigin.y + sizeVisible.height - 40));
    
    // 按钮菜单 -- Label【可添加多个，用NULL结尾】
    auto mLabel = Menu::create(milBack, NULL);
    mLabel->setPosition(Vec2::ZERO);
    this->addChild(mLabel, levelContentSimple);
    
    // Label::createWithCharMap 例子
    // 注：仅能使用资源图片上的字符，若出现资源图片上不存在的字符，则略过该字符
    // 一般用来显示数字，不过它也可以用来显示其他字符，如英文字符字体文件
    // 资源一般来自一张.png图片，或.plist文件
    // digit.png：850 * 100【每个数字：85 * 100】
    // 参数4：表明图片第一个是什么字符
    auto lCharMap = Label::createWithCharMap("digit.png", 85, 100, '0');
    lCharMap->setString("233我3");
    lCharMap->setHorizontalAlignment(TextHAlignment::LEFT);
    lCharMap->setVerticalAlignment(TextVAlignment::CENTER);
    lCharMap->setDimensions(340, 100);
    lCharMap->setPosition(Vec2(positionOrigin.x + 190, positionOrigin.y + sizeVisible.height - 130));
    this->addChild(lCharMap, levelContentSimple);
    
    // Label::createWithBMFont 例子
    // 注：仅能使用资源图片上的字符，若出现资源图片上不存在的字符，则略过该字符
    // 使用之前，需要添加好字体文件，包括一个图片文件【*.png】和一个字体坐标文件【*.fnt】，这两个文件名称必须一样【可以下载一个fnt编辑工具来自定义字体】
    auto lBMFont = Label::createWithBMFont("bitmapFontTest.fnt", "233YK我Yxxxx", TextHAlignment::LEFT);
    lBMFont->setVerticalAlignment(TextVAlignment::CENTER);
    lBMFont->setDimensions(140, 100);
    lBMFont->setPosition(Vec2(positionOrigin.x + 450, positionOrigin.y + sizeVisible.height - 130));
    this->addChild(lBMFont, levelContentSimple);

    // 阴影 例子
    // enableShadow(颜色，相对Label的偏移，模糊度）
    // 模糊度某些版本不支持
    auto lShadow = Label::createWithSystemFont("阴影", "arial.ttf", 28);
    lShadow->setTextColor(Color4B::WHITE);
    lShadow->setHorizontalAlignment(TextHAlignment::LEFT);
    lShadow->setVerticalAlignment(TextVAlignment::CENTER);
    lShadow->setDimensions(120, 80);
    lShadow->setPosition(Vec2(positionOrigin.x + 80, positionOrigin.y + sizeVisible.height - 240));
    lShadow->enableShadow(Color4B::GREEN, Size(10, 10), 80);
    this->addChild(lShadow, levelContentSimple);

    // 轮廓 例子
    // enableOutline(颜色，尺寸)
    auto lOutline = Label::createWithSystemFont("轮廓", "arial.ttf", 28);
    lOutline->setTextColor(Color4B::WHITE);
    lOutline->setHorizontalAlignment(TextHAlignment::LEFT);
    lOutline->setVerticalAlignment(TextVAlignment::CENTER);
    lOutline->setDimensions(120, 80);
    lOutline->setPosition(Vec2(positionOrigin.x + 220, positionOrigin.y + sizeVisible.height - 240));
    lOutline->enableOutline(Color4B::RED, 2);
    this->addChild(lOutline, levelContentSimple);

    // 发光 例子
    // enableGlow(颜色)
    // 仅支持TTF
    // 注：仅能使用字体文件包含的字符，若出现不存在的字符，则会显示乱码
    auto lGlow = Label::createWithTTF("GLOW", "paintBoy.ttf", 28);
    lGlow->setTextColor(Color4B::WHITE);
    lGlow->setHorizontalAlignment(TextHAlignment::LEFT);
    lGlow->setVerticalAlignment(TextVAlignment::CENTER);
    lGlow->setDimensions(120, 80);
    lGlow->setPosition(Vec2(positionOrigin.x + 360, positionOrigin.y + sizeVisible.height - 240));
    lGlow->enableGlow(Color4B::GREEN);
    this->addChild(lGlow, levelContentSimple);

    // 单独设置某个字符 例子
    // 使用TTF、CharMap、BMFont创建的文字标签，其字符串内容的每个字符都是一个Sprite精灵图片，可以对其进行单独的设置：如精灵放缩、执行动作等
    // 不支持System Font
    // getLetter(i)：获取第i个位置上的字符
    auto lLetter = Label::createWithTTF("233233", "paintBoy.ttf", 28);
    lLetter->setTextColor(Color4B::WHITE);
    lLetter->setHorizontalAlignment(TextHAlignment::LEFT);
    lLetter->setVerticalAlignment(TextVAlignment::CENTER);
    lLetter->setDimensions(300, 120);
    lLetter->setPosition(Vec2(positionOrigin.x + 170, positionOrigin.y + sizeVisible.height - 360));
    this->addChild(lLetter, levelContentSimple);

    // 操作第一个字符
    // 设置绿色
    // 放大到2倍
    auto sLetter1 = lLetter->getLetter(1);
    sLetter1->setColor(Color3B::GREEN);
    sLetter1->setScale(2.0f);

    // 操作第四个字符
    // 设置红色
    // 旋转
    auto sLetter4 = lLetter->getLetter(4);
    sLetter4->setColor(Color3B::RED);
    sLetter4->runAction(RepeatForever::create(RotateBy::create(1.0f, 90)));
}

// 返回功能
void LabelScene::back() {
    // 从事件分发器移除手机按键监听器
    Director::getInstance()->getEventDispatcher()->removeEventListener(listenerKeyboard);
    // 从场景堆栈中pop出一个场景，替换现在正运行的场景，而运行中的场景将被删除
    Director::getInstance()->popScene();
}

// 点击监听
void LabelScene::onClicked(Ref* rSender) {
    int tag = ((MenuItem*)rSender)->getTag();
    switch (tag) {
        case tagBack:
            // 返回按钮被点击
            this->back();
            break;
        default:
            break;
    }
}

// 键盘点击监听
void LabelScene::onKeyReleased(EventKeyboard::KeyCode keyCode, Event* event) {
    switch (keyCode){
        case EventKeyboard::KeyCode::KEY_BACK:
            // 返回键
            this->back();
            break;
        default:
            break;
    }
}
